<?php
App::uses('AppController', 'Controller');
class CallUserController extends AppController{
    public $uses = array('User','Transaction','BoxTransaction');
    private $msgCall = array(
                            1       =>      'Tài khoản của bạn không đủ số dư để thực hiện giao dịch.',
                            2       =>      ' hiện đang bận. Bạn có muốn đăng ký vào danh sách chờ hay không?',
                            3       =>      ' đang muốn kết nối với bạn. Bạn có đồng ý hay không?'
                        );
    private $callType   =   array(
                            1       =>      'User gửi yêu cầu tư vấn',
                            2       =>      'Chuyên gia đang bận',
                            3       =>      'Đồng ý tư vấn! Yêu cầu thực hiện thanh toán',
                            4       =>      'Chuyên gia từ chối tư vấn',
                            5       =>      'Số tiền không đủ để thực hiện cuộc gọi',
                            6       =>      'Tư vấn kết thúc'
                        );
    function beforeFilter(){
        parent::beforeFilter();
        $this->layout = 'font_end';
    }
    /**
     * This funcion start call
     * Check xem chuyen gia co dang tu van hay khong
     * Neu dang tu van thi tra lai thong bao ban cho user
     * Nguoc lai thi thoong baos doi 
    */
    function startCall(){
        $uExpert        = $_GET['uEx'];
        $userCurrent    = $this->Auth->user();
        if($userCurrent['group_id'] != 2){
            $uidCall        = $userCurrent['id'];
            //Kiem tra xem chuyen gia co ban hay khong
            $userExpertInfo = $this->User->find('first',array('conditions' => array('id' => $uExpert)));
            $statsUserExpert= $userExpertInfo['User']['status'];
            //end
            if($statsUserExpert== 1){
                //dang ban
                $response['code']       =   0;
                $response['uid']        =   $uExpert;
                $response['uName']      =   $userExpertInfo['User']['full_name'];
                $arrDataReturn          = json_encode($response);
                $this->response->body($arrDataReturn);
        		return $this->response;
            }
            $filename  = TMP.'chat/'.$uExpert.'_expert.txt';
            if(!file_exists($filename)){
                fopen($filename,'x+');
            }
            file_put_contents($filename,'1|@|'.time().'|@|'.$uidCall.'|@|1');
            flush();
            $response['code']   =   1;
        }else{
            $response['code']   =   2;
        }
        $arrDataReturn      =   json_encode($response);
        $this->response->body($arrDataReturn);
		return $this->response;
    }
    /**
     * This function luu user vao danh sach cho de goi
     */
    function savePedingCall(){
        $uExpertId = $_GET['uEx'];
        $userCurrent    = $this->Auth->user();
        $uidCall        = $userCurrent['id'];
        $arrDataInsert  = array(
                            'user_call'     =>  $uidCall,
                            'user_id'       =>  $uExpertId,
                            'time'          =>  time()
                        );
        try{
            $this->BoxTransaction->save($arrDataInsert);
        }catch(exception $ex){
            
        }
        $this->response->body(json_encode(array('code' => 1)));
        return $this->response;
        
    }
    /**
     * This function check Call
     * Thuc hien kiem tra cac thong bao nhanh cua chuyen gia phat sinh trong qua trinh call
     * 
    */
    function checkCallExpert(){
        $userCurrent = $this->Auth->user();
        if(!empty($userCurrent)){
            $filename  = TMP.'chat/'.$userCurrent['id'].'_expert.txt';
            if(!file_exists($filename)){
                fopen($filename,'x+');
            }
            // infinite loop until the data file is not modified
            $timestamp = $_GET['timestamp'];
            $lastmodif    = isset($timestamp) ? $timestamp : 0;
            $currentmodif = filemtime($filename);
            $i = 0;
            while ($currentmodif <= $lastmodif) // check if the data file has been modified
            {
                if($i < 100){
                    usleep(10000); // sleep 10ms to unload the CPU
                    clearstatcache();
                    $currentmodif = filemtime($filename);
                    ++$i;
                }else{
                    die();
                }
            }
            $response = array();
            $data = explode('|@|',file_get_contents($filename));
            if(sizeof($data) < 5){
                $uIdCall = 0;
                $uIdCall = @$data[2]; 
                @unlink($filename);
                flush();
                if($uIdCall > 0){
                    $userCallInfo = $this->User->find('first',array('conditions' => array('id' => $uIdCall)));
                    $response = array();
                    $response['code']       =   1;
                    $response['uId']        =   $uIdCall;
                    $response['typeMsg']    =   @$data[3];
                    $response['unameCall']  =   $userCallInfo['User']['full_name'] == ''?$userCallInfo['User']['username']:$userCallInfo['User']['full_name'];
                    $response['timescreate'] = date('G:i:s d/m/Y',@$data[1]);
                    $arrDataReturn = json_encode($response);
                }else{
                    $arrDataReturn = json_encode(array('code' => 0));
                }
            }else{
                $uIdCall = 0;
                $uIdCall = @$data[2]; 
                @unlink($filename);
                flush();
                if($uIdCall > 0){
                    $userCallInfo = $this->User->find('first',array('conditions' => array('id' => $uIdCall)));
                    $response = array();
                    $response['code']           =   2;
                    $response['uId']            =   $uIdCall;
                    $response['uExpertId']      =   $userCurrent['id'];
                    $response['transactionId']  =   @$data[3];
                    $response['typePayment']    =   @$data[4];
                    $response['unameCall']  =   $userCallInfo['User']['full_name'] == ''?$userCallInfo['User']['username']:$userCallInfo['User']['full_name'];
                    $response['timescreate'] = date('G:i:s d/m/Y',@$data[1]);
                    $arrDataReturn = json_encode($response);
                }else{
                    $arrDataReturn = json_encode(array('code' => 0));
                }
            }
        }else{
            $arrDataReturn = json_encode(array('code' => 0));
        }
        $this->response->body($arrDataReturn);
    	return $this->response;
    }
    /**
     * This function confirm call
     * Ghi thong tin chuyen gia phan hoi lai user
    */
    function confirmCall(){
        $typeConfirm = $_GET['type'];
        $uId = $_GET['uId'];
        $filename  = TMP.'chat/'.$uId.'_user.txt';
        $userExpertCurrent = $this->Auth->user();
        if($typeConfirm == 1){
            try{
                //dong y tu van => cap nhat lai trang thai cua chuyen gia
                $this->User->checkUpdate = true;
                $this->User->save(array('id' => $userExpertCurrent['id'],'status' =>  1));
                //end
                //kiem tra xem co trong cho khong de xoa di
                $userBoxTransaction = array();
                $userBoxTransaction = $this->BoxTransaction->find('first',array(
                                                                                'conditions'    =>  array(
                                                                                                        'user_call' =>  $uId,
                                                                                                        'user_id'   =>  $userExpertCurrent['id']
                                                                                                    )
                                                                            )
                                                                );
                if(!empty($userBoxTransaction)){
                    $this->BoxTransaction->deleteAll(array(
                                                            'user_call' =>  $uId,
                                                            'user_id'   =>  $userExpertCurrent['id']
                                                        ), false);
                }
                //end
            }catch(exception $ex){
                
            }
        }
        if(!file_exists($filename)){
            fopen($filename,'x+');
        }
        file_put_contents($filename,$typeConfirm.'|@|'.time().'|@|'.$userExpertCurrent['id']);
        flush();
        $response['code']   =   1;
        $arrDataReturn      =   json_encode($response);
        $this->response->body($arrDataReturn);
		return $this->response;
    }
    /**
     * This function check Call
     * Thuc hien kiem tra cac thong bao nhanh cua user phat sinh trong qua trinh call
     * 
    */
    function checkCallUser(){
        $userCurrent = $this->Auth->user();
        if(!empty($userCurrent)){
            $filename  = TMP.'chat/'.$userCurrent['id'].'_user.txt';
            if(!file_exists($filename)){
                fopen($filename,'x+');
            }
            // infinite loop until the data file is not modified
            $timestamp = $_GET['timestamp'];
            $lastmodif    = isset($timestamp) ? $timestamp : 0;
            $currentmodif = filemtime($filename);
            $i = 0;
            while ($currentmodif <= $lastmodif) // check if the data file has been modified
            {
                if($i < 100){
                    usleep(10000); // sleep 10ms to unload the CPU
                    clearstatcache();
                    $currentmodif = filemtime($filename);
                    ++$i;
                }else{
                    die();
                }
            }
            $response = array();
            $data = explode('|@|',file_get_contents($filename));
            $uIdExpert = 0;
            $uIdExpert = @$data[2]; 
            @unlink($filename);
            flush();
            if($uIdExpert > 0){
                $userExpertInfo = $this->User->find('first',array('conditions' => array('id' => $uIdExpert)));
                $response       = array();
                $response['typeConfirm']      =     @$data[0];
                $response['uIdExpert']        =     $uIdExpert;
                if(isset($data[3])){
                    $response['code']             =     2;
                }else{
                    $response['code']             =     1;
                }
                $response['unameExpertCall']  =     $userExpertInfo['User']['full_name'] == ''?$userExpertInfo['User']['username']:$userExpertInfo['User']['full_name'];
                $response['paidByHour']       =     $userExpertInfo['User']['paid_by_hour'];
				$response['turnBasedPayment'] =     $userExpertInfo['User']['turn_based_payment'];
                $response['timescreate']      =     date('G:i:s d/m/Y',@$data[1]);
                $arrDataReturn = json_encode($response);
            }else{
                $arrDataReturn = json_encode(array('code' => 0));
            }
        }else{
            $arrDataReturn = json_encode(array('code' => 0));
        }
        $this->response->body($arrDataReturn);
    	return $this->response;
    }
    /**
     * This function backCall
     * Ham xu ly chuc nang tu choi thanh toan
     */
    function backCall(){
        $uExpert        = $_GET['uEx'];
        $userCurrent    = $this->Auth->user();
        $uidCall        = $userCurrent['id'];
        $filename  = TMP.'chat/'.$uExpert.'_expert.txt';
        if(!file_exists($filename)){
            fopen($filename,'x+');
        }
        file_put_contents($filename,'1|@|'.time().'|@|'.$uidCall.'|@|0');
        flush();
        $response['code']   =   1;
        $arrDataReturn      =   json_encode($response);
        $this->response->body($arrDataReturn);
		return $this->response;
    }
    /**
     * This function Payment
     * Ham xu ly giao dich
     */
    public function Payment(){ // Hàm này cần check rõ hình thức thanh toán là như thế nào để lưu vào bảng transaction
    	$arrData = $this->request->query;
		$start_time = time();
		//get data user
        $userCurrent    = $this->Auth->user();
        $uidCall        = $userCurrent['id'];
		$uidCallInfo = $this->User->find('first',array('conditions'=>array(
														'id'  =>  $uidCall
														)));
		//get data for consultants
		$uidConsultants = $this->User->find('first',array('conditions'=>array(
													    'id'   =>  $arrData['uEx']
													)));
		$totalMoneyUser = $uidCallInfo['User']['total_money'];// tổng số tiền mà user đang sở hửu
		$service_fees 	= $uidConsultants['User']['consulting_fees'];//phí dịch vụ của nhà tư vấn
		$typePayment = $arrData['typePayment'];
		//tính phí dịch vụ
        if($service_fees != 0)
            $total_time = floor($totalMoneyUser/$service_fees);
        else
            $total_time = 0;
		// inser data into table transaction(giao dịch)
		if($total_time > 0 || $typePayment == 3){
			$arrUpdate = array(
						'name_need_advice' 	=> $uidCallInfo['User']['username'],
						'skype_need_advice' => $uidCallInfo['User']['skype'],
						'name_advice' 		=> $uidConsultants['User']['username'],
						'skype_advice' 		=> $uidConsultants['User']['skype'],
						'start_time'		=> $start_time,
						'end_time'			=> 0,
						'type_advice'		=> 0,
						'money_in'			=> 0,
						'money_out'			=> 0,
						'create_time'		=> time(),
						'update_time'		=> time()
					);
			$this->Transaction->save($arrUpdate); // lưu data vào bảng transaction(bảng này lưu thông tin giao dịch của user và chuyên gia)
			$transactionId = $this->Transaction->getInsertID(); //get last insert id
			$arrReturn = array(
                            'code'           => 1,
							'transaction_id' => $transactionId,
							'total_time' 	 => $total_time,
							'uid'		 	 => $uidConsultants['User']['id'],
							'uidcall'		 => $uidCallInfo['User']['id'],
                            'skype'          => $uidConsultants['User']['skype']
					);
        }else{
            $arrReturn = array(
                            'code'          =>  0,
                            'msg'           =>  'Số tiền trong tài khoản của bạn không đủ để thực hiện giao dịch!'
                    );
        }
		$arrDataReturn =  json_encode($arrReturn);
		$this->response->body($arrDataReturn);
		return $this->response;
    }
    /**
     * This function end call
     * 
     */
    public  function Endcall(){
        $this->User->checkUpdate = true;
    	$endtime = time();
    	$arrRequest = $this->request->query;
    	$uidCallInfo = $this->User->find('first',array('conditions'=>array(
    			'id'=>$arrRequest['uidCall']
    	)));
    	//get data for consultants
    	$uidConsultants = $this->User->find('first',array('conditions'=>array(
    			'id'=>$arrRequest['uid']
    	)));
    	$uidConsultants = $uidConsultants['User'];
    	$uidCallInfo = $uidCallInfo['User'];
    	$transactionInfo = $this->Transaction->find('first',array('condition'=>array('id'=>$arrRequest['transactionId'])));
        $transactionInfo = $transactionInfo['Transaction'];
   		$total_time_call = floor(($endtime - $transactionInfo['start_time'])/60); // tổng thời gian call của giao dịch được tính bằng phút và làm tròn xuống
	    if($this->request->query['typePayment'] == 1){
	    	
	    	$total_money_transaction  = $total_time_call * $uidConsultants['consulting_fees'];//tổng số tiền mà user mất cho giao dịch 
	    	
	    	$curent_total_money_user = $uidCallInfo['total_money'] - $total_money_transaction;//tổng số tiền còn lại của user sau khi thực hiện giao dịch
	    	
	    	$curent_total_money_consultants = $uidConsultants['total_money'] + $total_money_transaction ;// tổng số tiền của chuyên gia sau giao dịch
    	}else{
				$num_turn_use =  floor($total_time_call/$uidConsultants['num_turn_time']); //số turn mà user sẻ đã sử dụng trong giao dịch
				
				$total_money_transaction  = $total_time_call * $uidConsultants['consulting_fees_by_turn'];//tổng số tiền mà mất trong giao dịch
				
				$curent_total_money_user = $uidCallInfo['total_money'] - $total_money_transaction;//tổng số tiền còn lại của user sau khi thực hiện giao dịch
				$curent_total_money_consultants = $uidConsultants['total_money'] + $total_money_transaction ;// tổng số tiền của chuyên gia sau giao dịch 
    			 
    	}
    	
    	//cập nhật lại thông tin của giao dịch
    	
    	$arrDataTran[] = array(
	    			'id' 		=>$arrRequest['transactionId'],
	    			'end_time' 	=>$endtime,
	    			'money_in'	=>$total_money_transaction,
	    			'money_out'	=>$total_money_transaction
    			);
    	
    	$this->Transaction->saveMany($arrDataTran);//cập nhật lại thông tin của user
    	
    	//cập nhật lại thông số tiền cho user
    	$arrDataUpdateUser[] = array(
    				'id' =>$uidCallInfo['id'],
    				'total_money' =>$curent_total_money_user,
    				'total_transaction' => $uidCallInfo['total_transaction']+ 1,
    				'total_time_advice' =>  $uidCallInfo['total_time_advice']+ $total_time_call
    			   );
    	
    	$this->User->saveMany($arrDataUpdateUser);//cập nhật lại thông tin của user
    	//cập nhật lại thông tin cho consultans
    	$arrDataUpdateConsultans[] = array(
    			'id' =>$uidConsultants['id'],
    			'total_money' =>$curent_total_money_consultants,
    			'total_transaction' => $uidConsultants['total_transaction']+ 1,
    			'total_time_advice' =>  $uidConsultants['total_time_advice']+ $total_time_call,
    	);
    	 
    	$this->User->saveMany($arrDataUpdateConsultans);//cập nhật lại thông tin của user
        
        try{
            //dong y tu van => cap nhat lai trang thai cua chuyen gia
            
            $this->User->save(array('id' => $arrRequest['uid'],'status' =>  0));
            //end
        }catch(exception $ex){
            
        }
    	$this->backCallConfirm($arrRequest['uid'],$arrRequest['uidCall']); // gui phan hoi ket thuc cho chuyen gia
    	$this->backCallConfirm($arrRequest['uidCall'],$arrRequest['uid'],1); // gui phan hoi ket thuc cho chuyen gia
        die();
    }
    /**
     * This function backCallConfirm
     */
    function backCallConfirm($uExpertId,$uId,$type = 0){
        if($type == 0){
            $filename  = TMP.'chat/'.$uExpertId.'_expert.txt';
            if(!file_exists($filename)){
                fopen($filename,'x+');
            }
            file_put_contents($filename,'1|@|'.time().'|@|'.$uId.'|@|2');
        }else{
            $filename  = TMP.'chat/'.$uExpertId.'_user.txt';
            if(!file_exists($filename)){
                fopen($filename,'x+');
            }
            file_put_contents($filename,'1|@|'.time().'|@|'.$uId.'|@|2');
        }
        flush();
        $response['code']   =   1;
        $arrDataReturn      =   json_encode($response);
        $this->response->body($arrDataReturn);
		return $this->response;
    }
    /**
     * This function hien thi thong bao cho chuyen gia biet
     */
    function sendCallStats(){
        //'uid'       	 : userId,
//        'uidCall'   	 : uidCall,
//        'transactionId'	 :transactionId,
//        'typePayment'    : typePayment,
        $uExpertId      = $_GET['uid'];
        $userCurrentId  = $_GET['uidCall'];
        $transactionId  = $_GET['transactionId'];
        $typePayment    = $_GET['typePayment'];
        
        $filename  = TMP.'chat/'.$uExpertId.'_expert.txt';
        if(!file_exists($filename)){
            fopen($filename,'x+');
        }
        file_put_contents($filename,'1|@|'.time().'|@|'.$userCurrentId.'|@|'.$transactionId.'|@|'.$typePayment);
        flush();
        $response['code']   =   1;
        $arrDataReturn      =   json_encode($response);
        $this->response->body($arrDataReturn);
		return $this->response;
    }
}
?>